/********** webpack 2开发环境配置 **********/

const path = require('path');
const webpack = require('webpack');
const autoprefixer = require('autoprefixer');
const glob = require('glob');//读取资源
const HtmlWebpackPlugin = require('html-webpack-plugin');
const OS = require('os');// 获取本机 IP 地址

/********** 单、多页面配置开始 **********/

const config = {
    // 1. 入口文件
    // entry: './src/健康体检/js/index.js',        // 单页面
    entry: './src/健康体检/js/*.js',        // 多页面
    // entry: './src/yygh/js/*.js',         // 多页面

    // 2. 依赖
    libs: function(){
        // return ['jquery']
        return ['webpack-zepto', 'fastclick']
        // return ['webpack-zepto']
        // return []
    },

    // 3. Autoprefixer 配置
    prefix: {
        // browsers: ['last 4 version']//last n version 是从IE 11开始的, 如果需要兼容IE 8为 last 4 version
        browsers: ['last 1 version']
    },

    // 4. 是否使用 CDN 加速资源, 默认不使用
    /*cdn: {//如果使用该项，config.libs项目将不会打包进 vendor.js 内
        'webpack-zepto': 'Zepto',       // 项目内出现 require('webpack-zepto')或 import ? from 'webpack-zepto' 时将会使用 window.Zepto 代替
        'fastclick': 'FastClick',
    },*/

    // 5. Webpack-dev-server 配置
    server: {
        // host: getIPAddress(), // 是否通过 IP 地址访问项目, 默认使用 localhost 访问

        proxy: {//代理请求
            /* 正式服务器 */
            '/yjServer-SYS-Inter/service/*': {// jkda_PC、jkda_PHONE
                target: 'http://jkda.yj-health.com:8096'
            },
            '/yjGlServer-SYS-Inter/service/*': {//我的问卷、健康体检、活动详情、健康评估
                target: 'http://jkda.yj-health.com:8100'
            },

            /* 测试服务器 */
            /*'/yjServer-SYS-Inter/service/*': {// jkda_PC、jkda_PHONE
                target: 'http://120.35.26.129:8096'
            },
            '/yjGlServer-SYS-Inter/service/*': {//我的问卷、健康体检、活动详情、健康评估
                target: 'http://120.35.26.129:8100'
            }*/
        }
    }

    // 6. 为 *.html 添加 favicon 图标, 默认不添加【开发环境下一般不需要此配置】
    // favicon: './src/'+ 当前目录 +'/favicon.ico',
};
    
/********** 单、多页面配置结束 **********/

// 项目名称
const projectName = config.entry.match(/src\/(.+)\/js/)[1];// 例 A 或 A/A1 或 A/A1/A2 或 ...;//当前项目文件夹名称

// 所有的入口文件(已含依赖库)
const entries = getEntries( config.entry ); // 例 { a: 'a.js', b: 'b.js', ... }

// 所有的入口文件名称
const chunks = Object.keys( entries );// 例 [ 'a', 'b', ... ]

// 输出配置
config.bundle = {// 输出从简. 开发环境下无需 manifest.js 监听各位文件的版本
    outputPath: './',   // 以当前文件所在目录给存放目录, 即 'H:\工作目录\Yijia\20170418'
    filename: '[name].js',
    publicPath: '/', //绝对路径,务必以'/'开头
    imageName: '[hash].[ext]'
};

module.exports = {
    entry: entries,
    output: {
        path: path.resolve(__dirname, config.bundle.outputPath),
        filename: config.bundle.filename,
        publicPath: config.bundle.publicPath
    },
    externals: config.cdn,
    module: {
        rules: [
            { test: /\.js$/, exclude: /node_modules/, loader: 'babel-loader' },
            { test: /\.(less|css)$/, loader: 'style-loader!css-loader!less-loader' },
            { test: /\.(png|jpg|gif)$/i, loader: 'file-loader?name=' + config.bundle.imageName },
            { test: /\.html$/, loader: 'html-withimg-loader' }//处理 html 的图片路径并支持#include语法
        ]
    },
    plugins: [
        new webpack.optimize.CommonsChunkPlugin({
            names: ['vendor']
            // names: [ 'vendor', 'manifest' ]// 开发环境无需 manifest.js 这种监听各个文件版本号及耗时的操作
        }),
        new webpack.LoaderOptionsPlugin({ //webpack2写法上的差异
            options: {
                postcss: [autoprefixer(config.prefix)]
            }
        })
    ],
    devServer: {//由于webpack不支持低版本IE下启动服务实时测试，必须通过打包才知道测试结果。 
        host: config.server.host,
        proxy: config.server.proxy,
        contentBase: './',
        noInfo: true
    },
    performance: {
        hints: false
    }
}

/* 编译生成 html 文件置于内存 */
chunks.forEach(function(name) {
    if (name == 'vendor') {
        return;
    }
    var conf = {
        template: './src/'+ projectName + '/' + name +'.html',
        filename: name +'.html',
        inject: 'body'
    };

    if (config.favicon) conf.favicon = config.favicon;

    if (name in module.exports.entry) {
        conf.chunks = ['vendor', name];
        conf.hash = false;
    }
    module.exports.plugins.push(new HtmlWebpackPlugin(conf));
});

// 获取所有入口文件 (含第三方库)
function getEntries(globPath) {
    var entries = {
        vendor: config.libs()
    };
    glob.sync(globPath).forEach(function(entry) {
        var name = entry.split('/').splice(-1)[0].split('.')[0];
        entries[name] = [entry];//单元素数组
    });

    console.log(entries);

    return entries;
}

// 获取本地ip
function getIPAddress(){  
    var interfaces = OS.networkInterfaces();  
    for(var devName in interfaces){  
          var iface = interfaces[devName];  
          for(var i=0;i<iface.length;i++){  
               var alias = iface[i];  
               if(alias.family === 'IPv4' && alias.address !== '127.0.0.1' && !alias.internal){  
                     return alias.address;  
               }  
          }  
    }  
}
